ORM (Object-Relational Mapping) হল একটি প্রযুক্তি যা অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণাগুলিকে রিলেশনাল ডাটাবেসের সাথে সংযুক্ত করার জন্য ব্যবহৃত হয়। ORM-এর মাধ্যমে, আপনি অবজেক্ট এবং ডাটাবেসের টেবিলের মধ্যে সম্পর্ক তৈরি করতে পারেন, যাতে অবজেক্টের ডাটা রিলেশনাল ডাটাবেসে সঞ্চিত হতে পারে এবং রিলেশনাল ডাটাবেস থেকে অবজেক্টগুলিতে রূপান্তরিত হতে পারে। এটি ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য SQL কোড লেখার প্রয়োজন কমিয়ে আনে, এবং জাভা অবজেক্টগুলির সাথে কাজ করার মাধ্যমে ডেটাবেসের মধ্যে ডাটা ম্যানিপুলেশন সহজতর করে।
Hibernate ORM এর মূল উদ্দেশ্য
Hibernate হল একটি জনপ্রিয় ORM ফ্রেমওয়ার্ক যা Java প্রোগ্রামিং ভাষায় ব্যবহৃত হয়। Hibernate ডেটাবেসের টেবিলগুলির সাথে জাভা ক্লাসগুলির অবজেক্টগুলির ম্যাপিং সহজ করে তোলে। Hibernate সিস্টেম ডেভেলপারদের ডেটাবেসের সাথে সংযোগ স্থাপন এবং এর মধ্যে ডাটা ম্যানিপুলেশন (CRUD অপারেশন) করার জন্য JDBC এবং SQL এর পরিবর্তে সহজ API প্রদান করে।
ORM এর কাজের প্রক্রিয়া
ORM প্রক্রিয়া আসলে জাভা অবজেক্টের সাথে ডাটাবেসের টেবিলগুলির সম্পর্ক তৈরি এবং সেগুলির মধ্যে ডাটা ট্রান্সফার করা। ORM টুলস (যেমন Hibernate) ডেটাবেসের টেবিলগুলির সাথে অবজেক্ট ম্যাপিং তৈরি করার জন্য কিছু কনভেনশন এবং কনফিগারেশন অনুসরণ করে। এটি ডেটাবেসের সার্ভার থেকে অবজেক্ট তৈরি এবং আপডেট করতে SQL কোড বা জেপিএল (JPQL) ব্যবহার করে।
ORM এর সুবিধা
- SQL কোড কমানো:
- ORM ব্যবহার করলে আপনাকে SQL কোড কম লিখতে হয়, কারণ ORM নিজেই অনেক SQL কোড জেনারেট করে থাকে।
- ডেটাবেস নিরপেক্ষতা:
- ORM ফ্রেমওয়ার্কগুলির মাধ্যমে আপনি ডেটাবেসের নির্দিষ্ট কোডিংয়ের পরিবর্তে একাধিক ডেটাবেস সিস্টেমের মধ্যে পরিবর্তন করতে পারেন।
- অবজেক্ট-মডেল এবং ডাটাবেস মডেলের মধ্যে সম্পর্ক:
- ORM ক্লাসগুলির মধ্যে সম্পর্কের জন্য সহজভাবে ম্যানেজ করা সম্ভব হয়। যেমন, টেবিলের মধ্যে একটি
foreign keyসম্পর্ককে ক্লাসের মধ্যে একটি অ্যাসোসিয়েশন হিসেবে প্রকাশ করা যায়।
- ORM ক্লাসগুলির মধ্যে সম্পর্কের জন্য সহজভাবে ম্যানেজ করা সম্ভব হয়। যেমন, টেবিলের মধ্যে একটি
- ট্রানজেকশন ম্যানেজমেন্ট:
- ORM সাধারণত ডেটাবেসের সাথে একাধিক অপারেশনের ক্ষেত্রে ট্রানজেকশন ম্যানেজমেন্ট সরবরাহ করে।
- বিজ্ঞানভিত্তিক ডেটা অ্যাক্সেস:
- ORM ফ্রেমওয়ার্ক যেমন Hibernate, ডেটাবেসের মধ্যে object-oriented তত্ত্ব ব্যবহার করে ডেটা ম্যানিপুলেট করতে সক্ষম হয়।
Hibernate ORM এর প্রধান বৈশিষ্ট্য
- Automated Mapping:
- Hibernate ডেটাবেসের টেবিল এবং জাভা অবজেক্টের মধ্যে ম্যাপিং স্বয়ংক্রিয়ভাবে করে দেয়। এজন্য
@Entity,@Table,@Id,@Columnএবং অন্যান্য অ্যানোটেশন ব্যবহার করা হয়।
- Hibernate ডেটাবেসের টেবিল এবং জাভা অবজেক্টের মধ্যে ম্যাপিং স্বয়ংক্রিয়ভাবে করে দেয়। এজন্য
- Data Querying:
- Hibernate HQL (Hibernate Query Language) এবং Criteria API ব্যবহার করে ডেটাবেস থেকে ডাটা অনুসন্ধান করতে সক্ষম।
- Lazy Loading:
- Hibernate lazy loading সমর্থন করে, অর্থাৎ অবজেক্টের সম্পর্কযুক্ত ডাটা তখনই লোড করা হবে যখন তা প্রয়োজন হবে।
- Caching:
- Hibernate ক্যাশিং সমর্থন করে, যার মাধ্যমে বারবার ডেটাবেস থেকে ডাটা রিট্রিভ করার পরিবর্তে ক্যাশে থাকা ডাটা ব্যবহার করা হয়, যা পারফরম্যান্স বাড়ায়।
- Transaction Management:
- Hibernate ট্রানজেকশন পরিচালনা করতে সাহায্য করে, ডেটাবেসের বিভিন্ন অপারেশনকে একত্রিত করে একটি একক ট্রানজেকশন তৈরি করা সম্ভব হয়।
Hibernate ORM এর মাধ্যমে Object-Relational Mapping এর উদাহরণ
Step 1: Java Entity Class তৈরি করা
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "users") // Database Table Name
public class User {
@Id // Primary Key
private int id;
private String name;
private String email;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
এখানে, User ক্লাসটি একটি Java Entity যা users নামের ডাটাবেস টেবিলের সাথে ম্যাপ করা হয়েছে। @Id অ্যানোটেশন প্রাইমারি কি নির্দেশ করে এবং @Table ডাটাবেস টেবিলের নাম নির্ধারণ করে।
Step 2: Hibernate Configuration
Hibernate কনফিগারেশন করার জন্য hibernate.cfg.xml ফাইলটি তৈরি করতে হয়, যেখানে ডাটাবেসের কনফিগারেশন সেট করা হয়।
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/yourdb</property>
<property name="hibernate.connection.username">yourusername</property>
<property name="hibernate.connection.password">yourpassword</property>
<!-- JDBC connection pool settings -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<!-- Specify dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Echo all executed queries -->
<property name="hibernate.show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Disable the second-level cache -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed queries -->
<property name="hibernate.format_sql">true</property>
</session-factory>
</hibernate-configuration>
Step 3: Hibernate SessionFactory তৈরি করা
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory factory;
static {
try {
factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(User.class).buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
public static SessionFactory getFactory() {
return factory;
}
}
Step 4: Hibernate ব্যবহার করে ডাটা সেভ করা
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
public class Main {
public static void main(String[] args) {
// Get SessionFactory
SessionFactory factory = HibernateUtil.getFactory();
Session session = factory.getCurrentSession();
try {
// Create a new User object
User newUser = new User();
newUser.setName("John Doe");
newUser.setEmail("john.doe@example.com");
// Start a transaction
session.beginTransaction();
// Save the user object
session.save(newUser);
// Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
ORM এর মূল সুবিধা
- Database Independence: ORM ডেটাবেসকে অ্যাবস্ট্র্যাক্ট করে, অর্থাৎ আপনি বিভিন্ন ডেটাবেস ব্যবহার করতে পারেন কোড পরিবর্তন না করেই।
- Productivity: SQL কোড লেখার প্রয়োজন কমে যায়, কারণ ORM আপনাকে ম্যানুয়ালি SQL কোড লিখতে দেয় না।
- Improved Code Quality: ORM ফ্রেমওয়ার্ক যেমন Hibernate আপনাকে ন্যাচারাল অবজেক্ট-ওরিয়েন্টেড স্টাইলের কোড লেখার সুযোগ দেয়, যা কোডের পার্সিবিলিটি এবং মেন্টেনেবিলিটি উন্নত করে।
Hibernate ORM ব্যবহার করে Java অ্যাপ্লিকেশনগুলি ডেটাবেসের সাথে যোগাযোগ করতে খুবই কার্যকরী এবং সহজ। ORM সিস্টেমটি ডেটাবেস এবং অবজেক্ট মডেলগুলির মধ্যে সেতুবন্ধন তৈরি করে, যা ডেভেলপারদের জন্য ডেটাবেস ম্যানিপুলেশন আরও সহজ, পরিষ্কার, এবং টেস্টযোগ্য করে তোলে।
Read more